Spring Boot এ WebClient এবং Security ইন্টিগ্রেশন একটি শক্তিশালী সংমিশ্রণ যা নিরাপদভাবে API কল করতে এবং প্রয়োজনীয় অথেনটিকেশন বা অথরাইজেশন পরিচালনা করতে ব্যবহৃত হয়। WebClient Spring's reactive HTTP client, যা Spring Security এর সাথে OAuth2 বা Basic Authentication এর মাধ্যমে একত্রিত করা যেতে পারে।
pom.xml
এ নিচের ডিপেন্ডেন্সিগুলি যোগ করুন:<dependencies>
<!-- WebClient -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
<!-- Security -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<!-- OAuth2 Client (যদি OAuth2 প্রয়োজন হয়) -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-oauth2-client</artifactId>
</dependency>
</dependencies>
WebClient ব্যবহার করতে হলে WebClient.Builder
কনফিগার করা প্রয়োজন।
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.reactive.function.client.WebClient;
@Configuration
public class WebClientConfig {
@Bean
public WebClient webClient(WebClient.Builder builder) {
return builder.baseUrl("https://api.example.com") // আপনার API এর বেস URL
.build();
}
}
Basic Authentication ব্যবহারের জন্য HttpHeaders
এ Authorization
হেডার যোগ করতে হয়।
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpHeaders;
import org.springframework.stereotype.Service;
import org.springframework.web.reactive.function.client.WebClient;
import java.util.Base64;
@Service
public class ApiService {
private final WebClient webClient;
@Autowired
public ApiService(WebClient webClient) {
this.webClient = webClient;
}
public String getDataWithBasicAuth(String username, String password) {
String credentials = username + ":" + password;
String encodedCredentials = Base64.getEncoder().encodeToString(credentials.getBytes());
return webClient.get()
.uri("/data")
.header(HttpHeaders.AUTHORIZATION, "Basic " + encodedCredentials)
.retrieve()
.bodyToMono(String.class)
.block();
}
}
Spring Security OAuth2 Integration ব্যবহার করে API কল করার সময় টোকেন স্বয়ংক্রিয়ভাবে হেডারে যোগ করা হয়।
spring.security.oauth2.client.registration.myclient.client-id=YOUR_CLIENT_ID
spring.security.oauth2.client.registration.myclient.client-secret=YOUR_CLIENT_SECRET
spring.security.oauth2.client.registration.myclient.scope=read,write
spring.security.oauth2.client.registration.myclient.authorization-grant-type=client_credentials
spring.security.oauth2.client.provider.myclient.token-uri=https://oauth2-provider.com/oauth2/token
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.oauth2.client.OAuth2AuthorizedClientManager;
import org.springframework.security.oauth2.client.OAuth2AuthorizeRequest;
import org.springframework.security.oauth2.client.registration.ClientRegistrationRepository;
import org.springframework.security.oauth2.client.web.DefaultOAuth2AuthorizedClientManager;
import org.springframework.security.oauth2.client.web.OAuth2AuthorizedClientRepository;
import org.springframework.web.reactive.function.client.WebClient;
@Configuration
public class WebClientOAuth2Config {
@Bean
public OAuth2AuthorizedClientManager authorizedClientManager(
ClientRegistrationRepository clientRegistrationRepository,
OAuth2AuthorizedClientRepository authorizedClientRepository) {
return new DefaultOAuth2AuthorizedClientManager(clientRegistrationRepository, authorizedClientRepository);
}
@Bean
public WebClient webClient(WebClient.Builder builder, OAuth2AuthorizedClientManager authorizedClientManager) {
return builder.filter((request, next) -> {
OAuth2AuthorizeRequest authorizeRequest = OAuth2AuthorizeRequest.withClientRegistrationId("myclient").principal("principal").build();
String token = authorizedClientManager.authorize(authorizeRequest).getAccessToken().getTokenValue();
return next.exchange(
request.mutate()
.header(HttpHeaders.AUTHORIZATION, "Bearer " + token)
.build()
);
}).build();
}
}
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.reactive.function.client.WebClient;
@Service
public class ApiService {
private final WebClient webClient;
@Autowired
public ApiService(WebClient webClient) {
this.webClient = webClient;
}
public String getDataWithOAuth2() {
return webClient.get()
.uri("/secure-data")
.retrieve()
.bodyToMono(String.class)
.block();
}
}
Custom Authentication Header প্রয়োজন হলে সরাসরি হেডারে মান সেট করুন।
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpHeaders;
import org.springframework.stereotype.Service;
import org.springframework.web.reactive.function.client.WebClient;
@Service
public class ApiService {
private final WebClient webClient;
@Autowired
public ApiService(WebClient webClient) {
this.webClient = webClient;
}
public String getDataWithCustomHeader() {
return webClient.get()
.uri("/custom-auth")
.header(HttpHeaders.AUTHORIZATION, "Bearer your-custom-token")
.header("X-Custom-Header", "CustomValue")
.retrieve()
.bodyToMono(String.class)
.block();
}
}
WebClient এর মাধ্যমে ডেটা ফেচ করার জন্য Controller যোগ করুন।
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class ApiController {
@Autowired
private ApiService apiService;
@GetMapping("/fetch-data")
public String fetchData() {
return apiService.getDataWithOAuth2(); // OAuth2 Integration এর উদাহরণ
}
}
http://localhost:8080/fetch-data
হিট করুন।Spring Boot এ WebClient এবং Security Integration আপনাকে নিরাপদ এবং কার্যকরভাবে API কল করতে দেয়। Basic Authentication, OAuth2, এবং Custom Headers ব্যবহারের সুবিধা প্রদান করে এটি মাইক্রোসার্ভিস কমিউনিকেশনের জন্য একটি শক্তিশালী টুল।
যদি আপনাকে নির্দিষ্ট কোনো অংশে সাহায্য করতে হয়, জানাবেন! 😊
স্প্রিং বুটে WebClient ব্যবহার করে Basic এবং Bearer Token Authentication করার পদ্ধতি নিচে বিস্তারিতভাবে উদাহরণসহ দেখানো হয়েছে।
Basic Authentication-এ ব্যবহারকারী নাম এবং পাসওয়ার্ড সরাসরি HTTP হেডারে Authorization
ফিল্ডে Base64 এনকোডেড ফরম্যাটে পাঠানো হয়।
import org.springframework.stereotype.Service;
import org.springframework.web.reactive.function.client.WebClient;
@Service
public class BasicAuthWebClient {
private final WebClient webClient;
public BasicAuthWebClient(WebClient.Builder webClientBuilder) {
this.webClient = webClientBuilder
.baseUrl("https://api.example.com")
.defaultHeaders(headers -> headers.setBasicAuth("username", "password"))
.build();
}
public String getProtectedResource() {
return webClient.get()
.uri("/protected-resource")
.retrieve()
.bodyToMono(String.class)
.block();
}
}
অন্য যেকোনো জায়গায় Basic Authentication যুক্ত করতে চাইলে এটি Bean আকারে ব্যবহার করা যায়।
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.reactive.function.client.WebClient;
@Configuration
public class WebClientConfig {
@Bean
public WebClient basicAuthWebClient() {
return WebClient.builder()
.baseUrl("https://api.example.com")
.defaultHeaders(headers -> headers.setBasicAuth("username", "password"))
.build();
}
}
Bearer Token ব্যবহার করে সুরক্ষিত API অ্যাক্সেস করার সময় টোকেন Authorization
হেডারে Bearer <token>
ফরম্যাটে পাঠানো হয়।
import org.springframework.stereotype.Service;
import org.springframework.web.reactive.function.client.WebClient;
@Service
public class BearerTokenWebClient {
private final WebClient webClient;
public BearerTokenWebClient(WebClient.Builder webClientBuilder) {
this.webClient = webClientBuilder
.baseUrl("https://api.example.com")
.defaultHeaders(headers -> headers.setBearerAuth("your-access-token"))
.build();
}
public String getProtectedResource() {
return webClient.get()
.uri("/protected-resource")
.retrieve()
.bodyToMono(String.class)
.block();
}
}
যদি টোকেন ডায়নামিকভাবে সেট করতে হয়, তবে রিকোয়েস্টের সময় হেডারে টোকেন যোগ করা যায়।
import org.springframework.stereotype.Service;
import org.springframework.web.reactive.function.client.WebClient;
@Service
public class DynamicBearerTokenWebClient {
private final WebClient webClient;
public DynamicBearerTokenWebClient(WebClient.Builder webClientBuilder) {
this.webClient = webClientBuilder
.baseUrl("https://api.example.com")
.build();
}
public String getProtectedResource(String accessToken) {
return webClient.get()
.uri("/protected-resource")
.headers(headers -> headers.setBearerAuth(accessToken))
.retrieve()
.bodyToMono(String.class)
.block();
}
}
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class WebClientController {
@Autowired
private BasicAuthWebClient basicAuthWebClient;
@Autowired
private BearerTokenWebClient bearerTokenWebClient;
@Autowired
private DynamicBearerTokenWebClient dynamicBearerTokenWebClient;
@GetMapping("/basic-auth")
public String callWithBasicAuth() {
return basicAuthWebClient.getProtectedResource();
}
@GetMapping("/bearer-token")
public String callWithBearerToken() {
return bearerTokenWebClient.getProtectedResource();
}
@GetMapping("/dynamic-bearer-token")
public String callWithDynamicBearerToken() {
String token = "your-access-token"; // টোকেন সংগ্রহের উপায় অনুযায়ী ডাইনামিক টোকেন ব্যবহার করুন
return dynamicBearerTokenWebClient.getProtectedResource(token);
}
}
WebClient
-এর onStatus
ব্যবহার করে HTTP ত্রুটি হ্যান্ডলিং যুক্ত করুন।return webClient.get()
.uri("/protected-resource")
.retrieve()
.onStatus(
HttpStatus::isError,
response -> Mono.error(new RuntimeException("API call failed"))
)
.bodyToMono(String.class)
.block();
উপরের উদাহরণগুলো ব্যবহার করে আপনি WebClient দিয়ে Basic এবং Bearer Token Authentication সঠিকভাবে বাস্তবায়ন করতে পারবেন।
Spring Security এবং WebClient-এর ইন্টিগ্রেশন ব্যবহার করে আপনি সুরক্ষিত HTTP রিকুয়েস্ট পরিচালনা করতে পারেন। এটি প্রায়ই OAuth2, JWT, Basic Authentication, বা API Key ব্যবহার করে নিরাপদ অ্যাপ্লিকেশন তৈরি করতে ব্যবহৃত হয়।
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-oauth2-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-oauth2-jose</artifactId>
</dependency>
WebClient
-এ Spring Security কনফিগার করতে ServerOAuth2AuthorizedClientExchangeFilterFunction
ব্যবহার করতে হবে।
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.oauth2.client.registration.ClientRegistrationRepository;
import org.springframework.security.oauth2.client.web.reactive.function.client.ServerOAuth2AuthorizedClientExchangeFilterFunction;
import org.springframework.web.reactive.function.client.WebClient;
@Configuration
public class WebClientConfig {
@Bean
public WebClient webClient(ClientRegistrationRepository clientRegistrationRepository,
org.springframework.security.oauth2.client.web.server.ServerOAuth2AuthorizedClientRepository authorizedClientRepository) {
ServerOAuth2AuthorizedClientExchangeFilterFunction oauth2 =
new ServerOAuth2AuthorizedClientExchangeFilterFunction(clientRegistrationRepository, authorizedClientRepository);
oauth2.setDefaultOAuth2AuthorizedClient(true);
return WebClient.builder()
.filter(oauth2)
.build();
}
}
OAuth2 ক্লায়েন্ট কনফিগারেশনের জন্য application.yml
এ নিচের সেটিংস যোগ করুন:
spring:
security:
oauth2:
client:
registration:
my-client:
client-id: your-client-id
client-secret: your-client-secret
authorization-grant-type: client_credentials
scope: read
provider:
my-provider:
token-uri: https://example.com/oauth/token
WebClient
Bean ব্যবহার করে সুরক্ষিত API কল করতে পারেন।
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Mono;
@RestController
public class ApiController {
@Autowired
private WebClient webClient;
@GetMapping("/secure-api")
public Mono<String> callSecureApi() {
return webClient.get()
.uri("https://api.example.com/secure-data")
.retrieve()
.bodyToMono(String.class);
}
}
@GetMapping("/post-secure")
public Mono<String> postSecure() {
return webClient.post()
.uri("https://api.example.com/secure-endpoint")
.bodyValue(new MyRequest("data"))
.retrieve()
.bodyToMono(String.class);
}
static class MyRequest {
private String value;
public MyRequest(String value) {
this.value = value;
}
// Getters and setters
}
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.reactive.function.client.WebClient;
@Configuration
public class WebClientBasicAuthConfig {
@Bean
public WebClient webClientWithBasicAuth() {
return WebClient.builder()
.defaultHeaders(headers -> headers.setBasicAuth("username", "password"))
.build();
}
}
@GetMapping("/basic-auth-api")
public Mono<String> basicAuthApi() {
return webClientWithBasicAuth.get()
.uri("https://api.example.com/basic-auth")
.retrieve()
.bodyToMono(String.class);
}
@Bean
public WebClient webClientWithJwt() {
return WebClient.builder()
.defaultHeaders(headers -> headers.setBearerAuth("your-jwt-token"))
.build();
}
@GetMapping("/jwt-auth-api")
public Mono<String> jwtAuthApi() {
return webClientWithJwt.get()
.uri("https://api.example.com/jwt-secure")
.retrieve()
.bodyToMono(String.class);
}
Spring Security এবং WebClient এর ইন্টিগ্রেশন আপনাকে সুরক্ষিত HTTP কল সহজে পরিচালনা করতে সাহায্য করে। আপনি OAuth2, Basic Auth বা JWT Token ব্যবহার করে বিভিন্ন ধরণের নিরাপত্তা সমর্থিত API কল করতে পারবেন।
Spring Boot এর WebClient হল একটি আধুনিক, নন-ব্লকিং HTTP ক্লায়েন্ট, যা Spring Security এর সাথে ইন্টিগ্রেট করে নিরাপদ HTTP রিকোয়েস্ট প্রেরণ করতে ব্যবহৃত হয়। WebClient ব্যবহার করে আমরা বিভিন্ন ধরনের Authentication এবং Authorization মেকানিজম সহজেই ইমপ্লিমেন্ট করতে পারি।
WebClient এর মাধ্যমে একটি বেসিক অ্যান্থেন্টিকেশন হেডার যুক্ত করা যায়।
import org.springframework.web.reactive.function.client.WebClient;
public class BasicAuthExample {
public static void main(String[] args) {
WebClient webClient = WebClient.builder()
.baseUrl("https://example.com")
.defaultHeaders(headers -> headers.setBasicAuth("username", "password")) // Basic Auth
.build();
String response = webClient.get()
.uri("/secure-endpoint")
.retrieve()
.bodyToMono(String.class)
.block(); // Blocking for simplicity
System.out.println("Response: " + response);
}
}
Bearer Token ব্যবহারের মাধ্যমে API-তে Authorization হেডার যোগ করা হয়।
import org.springframework.web.reactive.function.client.WebClient;
public class BearerTokenExample {
public static void main(String[] args) {
WebClient webClient = WebClient.builder()
.baseUrl("https://example.com")
.defaultHeader("Authorization", "Bearer your-access-token") // Bearer Token
.build();
String response = webClient.get()
.uri("/secure-endpoint")
.retrieve()
.bodyToMono(String.class)
.block(); // Blocking for simplicity
System.out.println("Response: " + response);
}
}
Spring Boot এবং Spring Security ব্যবহার করে WebClient এর মাধ্যমে OAuth2 ব্যবহার করা যায়।
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-oauth2-client</artifactId>
</dependency>
spring.security.oauth2.client.registration.myclient.client-id=my-client-id
spring.security.oauth2.client.registration.myclient.client-secret=my-client-secret
spring.security.oauth2.client.registration.myclient.authorization-grant-type=client_credentials
spring.security.oauth2.client.provider.myprovider.token-uri=https://example.com/oauth/token
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.oauth2.client.OAuth2AuthorizedClientService;
import org.springframework.security.oauth2.client.web.reactive.function.client.ServerOAuth2AuthorizedClientExchangeFilterFunction;
import org.springframework.web.reactive.function.client.WebClient;
@Configuration
public class WebClientConfig {
@Bean
public WebClient webClient(OAuth2AuthorizedClientService authorizedClientService) {
ServerOAuth2AuthorizedClientExchangeFilterFunction oauth2Filter =
new ServerOAuth2AuthorizedClientExchangeFilterFunction(authorizedClientService);
return WebClient.builder()
.apply(oauth2Filter.oauth2Configuration())
.baseUrl("https://example.com")
.build();
}
}
import org.springframework.stereotype.Service;
import org.springframework.web.reactive.function.client.WebClient;
@Service
public class SecureService {
private final WebClient webClient;
public SecureService(WebClient webClient) {
this.webClient = webClient;
}
public String fetchSecureData() {
return webClient.get()
.uri("/secure-endpoint")
.retrieve()
.bodyToMono(String.class)
.block(); // Blocking for simplicity
}
}
import org.springframework.web.reactive.function.client.WebClient;
import java.util.HashMap;
import java.util.Map;
public class PostRequestExample {
public static void main(String[] args) {
WebClient webClient = WebClient.builder()
.baseUrl("https://example.com")
.defaultHeader("Authorization", "Bearer your-access-token")
.build();
Map<String, String> payload = new HashMap<>();
payload.put("key1", "value1");
payload.put("key2", "value2");
String response = webClient.post()
.uri("/secure-endpoint")
.bodyValue(payload) // JSON Payload
.retrieve()
.bodyToMono(String.class)
.block();
System.out.println("Response: " + response);
}
}
Spring Security ব্যবহার করে WebClient এর জন্য গ্লোবাল সিকিউরিটি কনফিগারেশন করা যায়।
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.reactive.EnableWebFluxSecurity;
import org.springframework.security.oauth2.client.OAuth2AuthorizedClientManager;
import org.springframework.security.oauth2.client.registration.ClientRegistrationRepository;
import org.springframework.security.oauth2.client.web.reactive.function.client.ServerOAuth2AuthorizedClientExchangeFilterFunction;
import org.springframework.web.reactive.function.client.WebClient;
@Configuration
@EnableWebFluxSecurity
public class SecurityConfig {
@Bean
public WebClient secureWebClient(OAuth2AuthorizedClientManager clientManager) {
ServerOAuth2AuthorizedClientExchangeFilterFunction oauth2Filter =
new ServerOAuth2AuthorizedClientExchangeFilterFunction(clientManager);
return WebClient.builder()
.apply(oauth2Filter.oauth2Configuration())
.baseUrl("https://example.com")
.build();
}
}
Spring Boot এর WebClient ব্যবহার করে সহজেই নিরাপদ HTTP রিকোয়েস্ট পাঠানো সম্ভব। Basic Authentication, Bearer Token, এবং OAuth2 ইন্টিগ্রেশন Spring Security-এর মাধ্যমে কার্যকরভাবে পরিচালিত হয়। প্রয়োজনে নির্দিষ্ট কোনো কনফিগারেশন বা উদাহরণ নিয়ে আরও আলোচনা করতে পারেন।
Read more